/*!
 * \file CtaStraContext.cpp
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief CTA策略上下文实现文件
 * 
 * 本文件实现了CTA策略上下文类的核心功能，作为CTA策略与引擎之间的桥梁。
 * 负责处理引擎的各种事件回调，并将这些事件转发给具体的CTA策略实例。
 * 包括策略初始化、交易时段管理、行情数据处理、K线闭合处理和定时调度等功能。
 */
#include "CtaStraContext.h"
#include "WtCtaEngine.h"
#include "../Includes/CtaStrategyDefs.h"

#include <exception>

#include "../Share/StrUtil.hpp"
#include "../Includes/WTSContractInfo.hpp"

/**
 * @brief 构造函数
 * 
 * 创建CTA策略上下文实例，初始化基础上下文
 * 
 * @param engine CTA引擎指针
 * @param name 策略名称
 */
CtaStraContext::CtaStraContext(WtCtaEngine* engine, const char* name)
	: CtaStraBaseCtx(engine, name)
{
}

/**
 * @brief 析构函数
 * 
 * 清理资源
 */
CtaStraContext::~CtaStraContext()
{
}

//////////////////////////////////////////////////////////////////////////
// 回调函数实现

/**
 * @brief K线闭合回调实现
 * 
 * 当订阅的K线周期闭合时被调用，将事件转发给绑定的CTA策略实例
 * 
 * @param code 合约代码
 * @param period K线周期（如"m1", "m5", "d1"等）
 * @param newBar 新闭合的K线数据
 */
void CtaStraContext::on_bar_close(const char* code, const char* period, WTSBarStruct* newBar)
{
	if (_strategy)
		_strategy->on_bar(this, code, period, newBar);
}

/**
 * @brief 策略初始化回调实现
 * 
 * 当策略需要初始化时被调用，先调用基类初始化，再转发给具体的策略实例
 */
void CtaStraContext::on_init()
{
	CtaStraBaseCtx::on_init();

	if (_strategy)
		_strategy->on_init(this);
}

/**
 * @brief 交易时段开始回调实现
 * 
 * 当交易时段开始时被调用，先调用基类处理，再转发给具体的策略实例
 * 
 * @param uTDate 交易日期（格式：YYYYMMDD）
 */
void CtaStraContext::on_session_begin(uint32_t uTDate)
{
	CtaStraBaseCtx::on_session_begin(uTDate);

	if (_strategy)
		_strategy->on_session_begin(this, uTDate);
}

/**
 * @brief 交易时段结束回调实现
 * 
 * 当交易时段结束时被调用，先转发给具体的策略实例，再调用基类处理
 * 
 * @param uTDate 交易日期（格式：YYYYMMDD）
 */
void CtaStraContext::on_session_end(uint32_t uTDate)
{
	if (_strategy)
		_strategy->on_session_end(this, uTDate);

	CtaStraBaseCtx::on_session_end(uTDate);
}

/**
 * @brief Tick数据更新回调实现
 * 
 * 当订阅的合约有新的Tick数据时被调用，检查订阅状态后转发给具体的策略实例
 * 
 * @param code 合约代码
 * @param newTick 新的Tick数据
 */
void CtaStraContext::on_tick_updated(const char* code, WTSTickData* newTick)
{
	// 检查是否订阅了该合约的Tick数据
	auto it = _tick_subs.find(code);
	if (it == _tick_subs.end())
		return;

	if (_strategy)
		_strategy->on_tick(this, code, newTick);
}

/**
 * @brief 定时计算回调实现
 * 
 * 定时调度时被调用，用于策略的定时计算和处理，转发给具体的策略实例
 * 
 * @param curDate 当前日期（格式：YYYYMMDD）
 * @param curTime 当前时间（格式：HHMM或HHMMSS）
 */
void CtaStraContext::on_calculate(uint32_t curDate, uint32_t curTime)
{
	if (_strategy)
		_strategy->on_schedule(this, curDate, curTime);
}



